package cn.zhx.domain.activity.respository;


import cn.zhx.domain.activity.model.aggregate.CreateQuotaOrderAggregate;
import cn.zhx.domain.activity.model.aggregate.CreatePartakeOrderAggregate;
import cn.zhx.domain.activity.model.entity.*;
import cn.zhx.domain.activity.model.valobj.ActivitySkuStockKeyVO;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * @author zhx
 * @description 活动仓储接口
 * @create 2024-03-16 10:31
 */
public interface IActivityRepository {

    /**
     * 根据SKU查询活动商品实体。
     *
     * @param sku 商品SKU编号。
     * @return 活动商品实体。
     */
    ActivitySkuEntity queryActivitySku(Long sku);

    /**
     * 根据活动ID查询抽奖活动实体。
     *
     * @param activityId 活动编号。
     * @return 抽奖活动实体。
     */
    ActivityEntity queryRaffleActivityByActivityId(Long activityId);

    /**
     * 根据活动统计ID查询活动统计实体。
     *
     * @param activityCountId 活动统计编号。
     * @return 活动统计实体。
     */
    ActivityCountEntity queryRaffleActivityCountByActivityCountId(Long activityCountId);

    /**
     * 保存订单聚合实体。
     *
     * @param createQuotaOrderAggregate 待保存的订单聚合实体。
     */
    void doSaveOrder(CreateQuotaOrderAggregate createQuotaOrderAggregate);

    /**
     * 将活动商品库存数量缓存起来。
     *
     * @param cacheKey   缓存键。
     * @param stockCount 库存数量。
     */
    void cacheActivitySkuStockCount(String cacheKey, Integer stockCount);

    /**
     * 从缓存中减去活动商品库存。
     *
     * @param sku         商品SKU编号。
     * @param cacheKey    缓存键。
     * @param endDateTime 活动结束时间。
     * @return 是否成功减去库存。
     */
    boolean subtractionActivitySkuStock(Long sku, String cacheKey, Date endDateTime);

    /**
     * 将活动商品库存消费信息发送到队列。
     *
     * @param build 构建的活动商品库存关键信息VO。
     */
    void activitySkuStockConsumeSendQueue(ActivitySkuStockKeyVO build);


    /**
     * 获取队列中的SKU库存信息。
     *
     * @return ActivitySkuStockKeyVO 对象，包含活动SKU的库存信息。
     */
    ActivitySkuStockKeyVO takeQueueValue();

    /**
     * 清除队列中的SKU库存信息。
     * 此操作可能是为了处理库存信息的错误，或者在特定条件下重置库存队列。
     */
    void clearQueueValue();

    /**
     * 更新指定SKU的活动库存。
     *
     * @param sku 需要更新库存的SKU的ID。
     */
    void updateActivitySkuStock(Long sku);

    /**
     * 清除指定SKU的活动库存信息。
     * 此操作可能是为了移除不再参与活动的SKU，或者处理库存数据错误。
     *
     * @param sku 需要清除库存信息的SKU的ID。
     */
    void clearActivitySkuStock(Long sku);

    /**
     * 查询未被使用的活动参与订单记录
     *
     * @param partakeRaffleActivityEntity 参与抽奖活动实体对象
     * @return 参与订单记录
     */
    UserRaffleOrderEntity queryNoUsedRaffleOrder(PartakeRaffleActivityEntity partakeRaffleActivityEntity);

    /**
     * 保存参与抽奖活动订单聚合对象
     *
     * @param createPartakeOrderAggregate 参与抽奖活动订单聚合对象
     */
    void saveCreatePartakeOrderAggregate(CreatePartakeOrderAggregate createPartakeOrderAggregate);

    /**
     * 根据用户ID和活动ID查询活动账户实体
     *
     * @param userId     用户ID
     * @param activityId 活动id
     * @return 活动账户实体
     */
    ActivityAccountEntity queryActivityAccountByUserId(String userId, Long activityId);

    /**
     * 根据用户ID和活动ID查询活动账户月实体
     *
     * @param userId     用户id
     * @param activityId 活动id
     * @param month      月
     * @return 活动账户月实体
     */
    ActivityAccountMonthEntity queryActivityAccountMonthByUserId(String userId, Long activityId, String month);

    /**
     * 根据用户ID和活动ID查询活动账户日实体
     *
     * @param userId     用户id
     * @param activityId 活动id
     * @param day        日
     * @return 活动账户日实体
     */
    ActivityAccountDayEntity queryActivityAccountDayByUserId(String userId, Long activityId, String day);

    /**
     * 根据活动ID查询活动sku列表
     *
     * @param activityId 活动id
     * @return 活动sku列表
     */
    List<ActivitySkuEntity> queryActivitySkuListByActivityId(Long activityId);

    /**
     * 查询用户账户日抽奖次数
     *
     * @param activityId 活动id
     * @param userId     用户id
     * @return 日抽奖次数
     */
    Integer queryRaffleActivityAccountDayPartakeCount(Long activityId, String userId);

    /**
     * 查询活动账户 - 总，参与次数
     *
     * @param activityId 活动ID
     * @param userId     用户ID
     * @return 参与次数
     */
    Integer queryRaffleActivityAccountPartakeCount(Long activityId, String userId);

    /**
     * 查询未支付订单
     *
     * @param skuRechargeEntity 充值实体
     * @return 未支付订单
     */
    UnpaidActivityOrderEntity queryUnpaidActivityOrder(SkuRechargeEntity skuRechargeEntity);

    /**
     * 查询用户积分账户额度
     *
     * @param userId 用户id
     * @return 账户额度
     */
    BigDecimal queryUserCreditAccountAmount(String userId);

    /**
     * 保存未支付订单
     *
     * @param createQuotaOrderAggregate 创建订单聚合对象
     */
    void doSaveNoPayOrder(CreateQuotaOrderAggregate createQuotaOrderAggregate);

    /**
     * 保存积分支付订单
     *
     * @param createQuotaOrderAggregate 创建订单聚合对象
     */
    void doSaveCreditPayOrder(CreateQuotaOrderAggregate createQuotaOrderAggregate);

    /**
     * 更新订单
     *
     * @param deliveryOrderEntity 订单实体
     */
    void updateOrder(DeliveryOrderEntity deliveryOrderEntity);

    /**
     * 查询sku商品列表
     *
     * @param activityId 活动id
     * @return 商品列表
     */
    List<SkuProductEntity> querySkuProductEntityListByActivityId(Long activityId);
}
